/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Persistencia;

/**
 *
 * @author RafaelGutierrez
 */
import cprincipal.Paciente;
import cprincipal.Persona;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

public class PacienteXml {

    private Element root;
    private String fileLocation = "src/Archivos/pacientes.xml";

    public PacienteXml() {
        try {
            SAXBuilder builder = new SAXBuilder(false);
            Document doc = null;
            doc = builder.build(fileLocation);
            root = doc.getRootElement();
        } catch (JDOMException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        }
    }

    private Element PacientetoXmlElement(Paciente nPaciente) {
        Element Pacientetrans = new Element("paciente");

            Element nombre = new Element("nombre");
                nombre.setText(nPaciente.getNombre());

            Element apellido = new Element("apellido");
                apellido.setText(nPaciente.getApellido());

            Element cedula = new Element("cedula");
                cedula.setText(Integer.toString(nPaciente.getCedula()));

            Element anionac = new Element("anionac");
                anionac.setText(nPaciente.getAnionac());

            Element localidad = new Element("localidad");
                localidad.setText(nPaciente.getLocalidad());

            Element telefono = new Element("telefono");
                telefono.setText(nPaciente.getTelefono());

            Element direccion = new Element("direccion");
                direccion.setText(nPaciente.getDireccion());

            Element tipoplan = new Element("tipoplan");
                tipoplan.setText(nPaciente.getTipoplan());
            

        Pacientetrans.addContent(nombre);
        Pacientetrans.addContent(apellido);
        Pacientetrans.addContent(cedula);
        Pacientetrans.addContent(anionac);
        Pacientetrans.addContent(localidad);
        Pacientetrans.addContent(telefono);
        Pacientetrans.addContent(direccion);
        Pacientetrans.addContent(tipoplan);

        return Pacientetrans;
    }

    /*Método que retorna un Estudiante. A este metodo se le manda un Element y con
    sus datos se hará los pasos requeridos para crear el Estudiante*/
    private Paciente PacientetoObject(Element element) throws ParseException {
        Paciente nPaciente = new Paciente();

                nPaciente.setNombre(element.getChildText("nombre"));
                nPaciente.setApellido(element.getChildText("apellido"));
                nPaciente.setCedula(Integer.parseInt(element.getChildText("cedula")));
                nPaciente.setAnionac(element.getChildText("anionac"));
                nPaciente.setLocalidad(element.getChildText("localidad"));
                nPaciente.setTelefono(element.getChildText("telefono"));
                nPaciente.setDireccion(element.getChildText("direccion"));
                nPaciente.setTipoplan(element.getChildText("tipoplan"));

        return nPaciente;
    }


    private boolean updateDocument() {
        try {
            XMLOutputter out = new XMLOutputter(org.jdom.output.Format.getPrettyFormat());
            FileOutputStream file = new FileOutputStream(fileLocation);
            out.output(root, file);
            file.flush();
            file.close();
            return true;
        } catch (Exception e) {
            System.out.println("error: " + e.getMessage());
            return false;
        }
    }

    public static Element buscar(List raiz, String dato) {
        Iterator i = raiz.iterator();
        while (i.hasNext()) {
            Element e = (Element) i.next();
            if (dato.equals(e.getChild("cedula").getText())) {
                return e;
            }
        }
        return null;
    }

    public boolean agregarPaciente(Paciente nPaciente) {
        boolean resultado = false;
        root.addContent(PacientetoXmlElement(nPaciente));
        resultado = updateDocument();
        return resultado;
    }



    public Paciente buscarPaciente(Integer cedula) {
        Element aux = new Element("paciente");
        List Pacientes = this.root.getChildren("paciente");
        while (aux != null) {
            aux = PacienteXml.buscar(Pacientes, Integer.toString(cedula));
            if (aux != null) {
                try {
                    return PacientetoObject(aux);
                } catch (ParseException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }
        return null;
    }

    public boolean actualizarPaciente(Paciente nPaciente) {
        boolean resultado = false;
        Element aux = new Element("paciente");
        List Pacientes = this.root.getChildren("paciente");
        while (aux != null) {
            aux = PacienteXml.buscar(Pacientes, Integer.toString(nPaciente.getCedula()));
            if (aux != null) {
                Pacientes.remove(aux);
                resultado = updateDocument();
            }
        }
        agregarPaciente(nPaciente);
        return resultado;
    }

    /* @param cedula cedula del Estudiante a borrar
     * @return valor boleano con la condicion de exito  */
    public boolean borrarPaciente(Integer cedula) {
        boolean resultado = false;
        Element aux = new Element("paciente");
        List Pacientes = this.root.getChildren("paciente");
        while (aux != null) {
            aux = PacienteXml.buscar(Pacientes, String.valueOf(cedula));
            if (aux != null) {
                Pacientes.remove(aux);
                resultado = updateDocument();
            }
        }
        return resultado;
    }


    /* Para obtener todos los Estudiantes
     * @return ArrayList con todos los objetos Estudiante  */
    public ArrayList<Paciente> todoslosdoctores() {
        ArrayList<Paciente> resultado = new ArrayList<Paciente>();
        for (Object it : root.getChildren()) {
            Element xmlElem = (Element) it;
            try {
                resultado.add(PacientetoObject(xmlElem));
            } catch (ParseException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return resultado;
    }
}
